#ifndef WORLD_H
#define WORLD_H

#define ELEMENTS 70
#define TEMP_ELEMENTS 10
#define TEST_ELEMENTS 5
#define MAP_SECTOR_ELEMENTS 350


#include <string>
namespace sic_mundus_creatus_est{
//struct matrix_pixel{

//};

class world{
private:
//	std::string const invariant{};
	int map[ELEMENTS][ELEMENTS];
	int (*ptr)[ELEMENTS] =map;
//	int elem1=0;
//      int elem2=0;
public:
	world();
//	world(int x, int y):x{elem1},y{elem2}{}
	world(std::string harmonious_seed1,std::string harmonious_seed2);
//	world(std::string& world_type ) : invariant (world_type){};
	world(const world&)=default; 		//copy constructor	
	world(world&&)=default;			//displacement constructor
	world& operator=(const world&)=default;	//copy assignment
	world& operator=(world&&)=default;	//displacement assignment
	~world()=default;			//destructor


 	inline int& matrix_value(int x, int y)const noexcept;
	inline int& get(int x, int y)const noexcept{return ptr[x][y];}// SFML sistemare


//std::vector<world> list_menu;
world& world_generate(int southsizeseed1, int westsizeseed2,int northsizeseed3, int Eastsizeseed4,int seed1a,int seed1b,int seed2a,int seed2b,int seed3a,int seed3b,int seed4a,int seed4b);
void world_test();


//void lake(int );
//void rock(int );
//void river(int );
//void sea(int );
//void destroy_world();
//void save_world();
//void load_world();
//void save_world_test();
//void load_world_test();
//void print_x_y();/// ?
}; // end world class


class map_sector{


private:

//int map_sectors[245][245];
//int map_sectors[ELEMENTS][ELEMENTS][MAP_SECTOR_ELEMENTS+1][MAP_SECTOR_ELEMENTS+1];
int ****ptr_matrix;
//int *ptr;
// int** matrice;
  
 //int* matrice;
 // int **matrice;
//int *array_4d;
//int (*ptr_matrix)[ELEMENTS][ELEMENTS][MAP_SECTOR_ELEMENTS+1][MAP_SECTOR_ELEMENTS+1];
//int map_sectors[ELEMENTS][ELEMENTS][MAP_SECTOR_ELEMENTS+1][MAP_SECTOR_ELEMENTS+1];
public:
	map_sector();//:matrice{new int(10)}{};
//	map_sector(world );
//	std::string const invariant;
//	int* elem=nullptr;
//	int elem1=0;
//	int elem2=0;
//	world sic_mundus_creatus_est_1_0;
//public:
//	map_sector(world& sic_mundus_creatus_est);
//	map_sector(int seed,const world& sic_mundus_creatus_est) : sic_mundus_creatus_est_1_0(sic_mundus_cretus_est), elem1{MAP_SECTOR_ELEMENTS+1},elem2{MAP_SECTOR_ELEMENTS+1}{}
	//map_sector():elem1=ELEMENTS,elem2=ELEMENTS,elem3=MAP_SECTOR_ELEMENTS+1,elem4=MAP_SECTOR_ELEMENTS+1{};
//	map_sector(const std::string& test): invariant(test){};
//	~map_sector(){delete[] elem;}


void  map_sectors_generate();
inline int& get(int x, int y,int z, int w)const noexcept{return ptr_matrix[x][y][z][w];}// SFML sistemare
/*
map_sector(const map_sector&)=default;			//forbidden copy
map_sector& operator=(const map_sector&)=default;	//forbidden assignment
map_sector(map_sector&&)=default;			//forbidden copy displacement 
map_sector& operator=(map_sector&&)=default;		//forbidden assignment displacement 
*/
~map_sector(){
for (int i = 0; i < 70; ++i) {
    for (int j = 0; j < 351; ++j) {
        for (int k = 0; k < MAP_SECTOR_ELEMENTS; ++k) {
           delete[] ptr_matrix[i][j][k];
        }
        delete[] ptr_matrix[i][j];
    }
    delete[] ptr_matrix[i];
}
delete[] ptr_matrix;


}


/*

for (int i = 0; i < 2; i++) {
        delete[] matrice[i];}
   
delete[] matrice;}
*/
//map_sector& map_sectors_generate();
//map_sector& map_test(); // into costructor
//city& trasmute_world_extended(map_sector urbis); // map 1.1
//city& sic_mundus_creatus_est_extended(); //map 1.1
//void to_search_house_zone();
//void record_coordinates_zone_house();
//void save_map_sector():
//void load_map_sector();

};

class city
{
private:
	
	//int* elem=nullptr;
	//int elem1=0;
	//int elem2=0;
	world sic_mundus_creatus_est;
	map_sector urbis_sectors;

public:
	city(std::string harmonious_seed1,std::string harmonious_seed2):sic_mundus_creatus_est(harmonious_seed1,harmonious_seed2){};
//	city(map_sector& urbis);
//	city(world& sic_mundus_creatus_est, map_sector& urbis);
	~city();


//	city& build_city(map_sector urbis);
//	void save_city();
//	void load_city();
};


}//end namespace


#endif



